package com.gyyweishang.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SecurityException;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;

@Slf4j//@Slf4j注解用于定义一个日志对象
public class JwtUtils {

    // 密钥初始化（HS256算法要求密钥长度≥256位）
    private static final SecretKey SECRET_KEY = Keys.secretKeyFor(io.jsonwebtoken.SignatureAlgorithm.HS256);

    //通过配置项使用固定密匙（生产环境推荐使用）
    // private static final SecretKey SECRET_KEY = Keys.hmacShaKeyFor(
    //       Decoders.BASE64.decode(config.getProperty("jwt.secret")));

    // 默认令牌有效期（24小时）
    private static final long DEFAULT_EXPIRATION = 60 * 60 * 1000 * 24;

    private JwtUtils() {
        // 私有构造防止实例化
    }

    /**
     * 生成JWT令牌
     *
     * @param claims 自定义声明内容
     * @return 加密后的令牌字符串
     */
    public static String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .signWith(SECRET_KEY)
                .claims(claims)
                .expiration(new Date(System.currentTimeMillis() + DEFAULT_EXPIRATION))
                .compact();
    }

    /**
     * 解析验证JWT令牌
     *
     * @param token 待解析的令牌字符串
     * @return 解析后的声明对象
     * @throws SecurityException 当令牌无效/过期/被篡改时抛出
     */
    public static Claims parseToken(String token) {
        return Jwts.parser()
                .verifyWith(SECRET_KEY)
                .build()
                .parseSignedClaims(token)
                .getPayload();

    }
}
